package express_parser

import (
	"strings"
	"time"
	"EasyReson/util"
)

const(
	//当前时间的不同表述形式
	timeYMDSeparte  = "yyyy-MM-dd"
	timeYMDSeparteH="yyyy-MM-dd HH"
	timeYMDSeparteHM="yyyy-MM-dd HH:mm"
	timeYMDSeparteHMS="yyyy-MM-dd HH:mm:ss"
	timeYMDHM="yyyy-MM-dd HHmm"
	timeYMD= "yyyyMMdd"
	timeYMDHMS="yyyy-MM-dd HHmmss"
	timeYMDHMSNoSeparte="yyyyMMddHHmmss"
	timeH="HH"
	timeHM="HH:mm"
	timeHMS="HH:mm:ss"
	timeHMSNoSeparte="HHmmss"
	//当天时间的0时0分0秒，即整点时刻
	dayYMDSeparteH="yyyy-MM-dd 00"
	dayYMDSeparteHM="yyyy-MM-dd 00:00"
	dayYMDSeparteHMS="yyyy-MM-dd 00:00:00"


	now="now" //表达式中的当前时间

	add="+" //运算符+
	minus="-" //运算符-

	//占位符的El表达式的解析方式
	elPrefix="${"
	elSuffix="}"

	//时间字符串的表达式解析方式
	timeStrPrefix="#TimeStr{"
	timeStrSuffix="}"

	mPrefix="("
	mSuffix=")"



)
/**
	脚本解析器
	一：${A}则，取${}里面的内容，表示映射的字段
	二：#TimeStr{(now-1)(yyyy-MM-dd)} 类型的表达式，(yyyy-MM-dd) 为时间的各式。返回字符串的当前的时间
 */
func ParserScript(script string) string{
	//一
	if strings.Contains(script,elPrefix)&& strings.Contains(script,elSuffix){
		return script[strings.Index(script,elPrefix)+len(elPrefix):strings.Index(script,elSuffix)]
	}
	//二
	if strings.Contains(script,timeStrPrefix) && strings.Contains(script,timeStrSuffix){
		script =script[strings.Index(script,timeStrPrefix)+len(timeStrPrefix):strings.Index(script,timeStrSuffix)]
		express := script[strings.Index(script,mPrefix)+len(mPrefix):strings.Index(script,mSuffix)]
		format :=  script[strings.LastIndex(script,mPrefix)+len(mPrefix):strings.LastIndex(script,mSuffix)]
		//根据表达式获取真实timer
		timer :=getTimer(express)
		return  formatTime(format,timer)
	}
	//否则，原样返回
	return script
}
/*
	根据表达式获取Timer对象
 */
func getTimer(express string) time.Time{

	var symBol string
	var number string
	var iNumber int
	var timer time.Time
	if strings.Contains(express,now) && len(express)>4{
		symBol = express[len(now):len(now)+1]
		number = express[len(now)+1:]
		iNumber,_ =util.StrConverToInt(number)
	}
	if iNumber!=0 {
		if add==symBol {
			timer = time.Now().AddDate(0,0,+iNumber)
		}
		if minus==symBol {
			timer = time.Now().AddDate(0,0,-iNumber)
		}
	}else{
		timer = time.Now()
	}
	return timer
}

/**
	获取字符串的时间
 */
func formatTime(format string,timer time.Time) (result string){

	if timeYMDSeparte==format {
		return timer.Format("2006-01-02")
	}
	if timeYMD ==format {
		return timer.Format("20060102")
	}
	if timeYMDSeparteH==format{
		return timer.Format("2006-01-02 15")
	}
	if timeYMDSeparteHM==format{
		return timer.Format("2006-01-02 15:04")
	}
	if timeYMDSeparteHMS==format{
		return timer.Format("2006-01-02 15:04:05")
	}
	if timeYMDHM==format{
		return timer.Format("2006-01-02 1504")
	}
	if timeYMDHMS==format{
		return timer.Format("2006-01-02 150405")
	}
	if timeYMDHMSNoSeparte==format{
		return timer.Format("20060102150405")
	}
	if timeH==format{
		return timer.Format("15")
	}
	if timeHM ==format{
		return timer.Format("15:04")
	}
	if timeHMS==format{
		return timer.Format("15:04:05")
	}
	if timeHMSNoSeparte==format{
		return timer.Format("150405")
	}
	if dayYMDSeparteH==format{
		return timer.Format("2006-01-02")+" 00"
	}
	if dayYMDSeparteHM ==format{
		return timer.Format("2006-01-02")+" 00:00"
	}
	if dayYMDSeparteHMS ==format{
		return timer.Format("2006-01-02")+" 00:00:00"
	}
	//默认使用yyyy-MM-dd
	return timer.Format("2006-01-02")
}
